home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / UTIL / PROGRAMMING / GAMESUITE / GameSuite / Utilities / Hammer / FDecSource < prev    next >
Text File  |  1995-01-20  |  5KB  |  346 lines

  1.  
  2. #name fdecomp
  3. #type &ffc
  4. #base 0
  5.  
  6. ; This file should be compiled with ExtAsm
  7.  
  8. struct v {
  9.  
  10.   .sizeof
  11. }
  12.  
  13. macro getbyte
  14. {
  15.   STMFD R13!,{R1}
  16.   MOV R1,R6
  17.   SWI XOS_BGet
  18.   LDMFD R13!,{R1}
  19.   BCS overrunerr
  20. }
  21. macro getword
  22. {
  23.   STMFD R13!,{R1-R2}
  24.   MOV R2,#0
  25.   MOV R1,R6
  26.   SWI XOS_BGet
  27.   ORRCC R2,R2,R0
  28.   SWICC XOS_BGet
  29.   ORRCC R2,R2,R0,LSL #8
  30.   SWICC XOS_BGet
  31.   ORRCC R2,R2,R0,LSL #16
  32.   SWICC XOS_BGet
  33.   ORRCC R0,R2,R0,LSL #24
  34.   LDMFD R13!,{R1-R2}
  35.   
  36. }
  37.  
  38. macro putbyte
  39. {
  40.   STMFD R13!,{R0}
  41.   ADD R10,R10,#1
  42.   MOV R0,R10
  43.   translate
  44.   MOV R1,R0
  45.   LDMFD R13!,{R0}
  46.   STRB R0,[R1]
  47. }
  48.  
  49. macro translate
  50. {
  51. CMP R7,#0
  52. BEQ _transend
  53. SUB R0,R0,R7
  54. MOV R1,R0,LSL #2
  55. SUBS R0,R0,R8,LSR #2
  56. ADDPL R1,R1,#1
  57. SUBPL R1,R1,R8
  58. SUBS R0,R0,R8,LSR #2
  59. ADDPL R1,R1,#1
  60. SUBPL R1,R1,R8
  61. SUBS R0,R0,R8,LSR #2
  62. ADDPL R1,R1,#1
  63. SUBPL R1,R1,R8
  64. MOV R0,R1
  65. ADD R0,R0,R7
  66. ._transend
  67. }
  68.  
  69.  
  70. ;init conditions
  71. ;R0 points to the filename
  72. ;R1 points to a path variable, or =0
  73. ;exits with R2 = size of decompressed file
  74. ;           R3 = address to return to after allocation
  75.  
  76. .init
  77. STMFD R13!,{R1,R4-R7,R14}
  78. MOV R7,R0
  79. BL openfile
  80. ADRVS R3,traperr
  81. LDMVSFD R13!,{R1,R4-R7,PC}
  82. getword
  83. LDMCSFD R13!,{R1,R4-R7,R14}
  84. BCS fileerr
  85. MOV R1,R0
  86. getword
  87. LDMCSFD R13!,{R1,R4-R7,R14}
  88. BCS fileerr
  89. BL closefile
  90. BIC R1,R1,#&FFFF<<16
  91. LDR R2,idcode
  92. CMP R1,R2
  93. LDMNEFD R13!,{R1,R4-R7,R14}
  94. BNE nothmr
  95. MOV R2,R0
  96. MOV R0,R7
  97. MOV R3,PC
  98. LDMFD R13!,{R1,R4-R7,PC}  ;drops through via R3
  99.  
  100.  
  101. ;entry conditions
  102. ;R0 = filename
  103. ;R1 = path variable or 0
  104.  
  105. .entry
  106. STMFD R13!,{R3-R11,R14}
  107. MOV R10,R2
  108. BL openfile
  109. LDMVSFD R13!,{R3-R11,PC}
  110.  
  111. getword
  112. MOV R7,R0
  113. BIC R0,R0,#&FFFF<<16
  114. LDR R1,idcode
  115. CMP R1,R0
  116. BNE nothmr2
  117. getword
  118. ADD R0,R0,#3
  119. BIC R0,R0,#3
  120. MOV R9,R0
  121. MOV R8,R9  ;used as a constant
  122. ADD R9,R10,R9; R9 is the end limit marker
  123. MOV R0,R7
  124. TST R0,#1<<24
  125. MOV R7,R10
  126. MOVEQ R7,#0
  127. SUB R10,R10,#1; align for putbyte
  128. SUB R9,R9,#1  ; likewise
  129. .loop1
  130. getbyte
  131. CMP R0,#&10
  132. BLT type1
  133. CMP R0,#&20
  134. BLT type2
  135. CMP R0,#&40
  136. BLT type3
  137. CMP R0,#&80
  138. BLT type4
  139. ;drops through
  140. .type5
  141. CMP R0,#&FF
  142. BEQ overrunerr
  143. MOV R1,R0
  144. getbyte
  145. AND R2,R1,#&78
  146. MOV R2,R2,LSR #3
  147. ADD R2,R2,#2
  148. AND R3,R1,#&7
  149. ADD R3,R0,R3,LSL #8
  150. SUB R3,R10,R3
  151. .loop7
  152. MOV R0,R3
  153. translate
  154. LDRB R0,[R0]
  155. putbyte
  156. ADD R3,R3,#1
  157. SUBS R2,R2,#1
  158. BGT loop7
  159. .typeins
  160. CMP R10,R9
  161. BLT loop1
  162. BLNE inconserr
  163. getbyte
  164. CMP R0,#&FF
  165. BNE underrunerr
  166. .decompend
  167. BL closefile
  168. MOV R2,#&FFF
  169. LDMFD R13!,{R3-R11,PC}
  170.  
  171. .type1     ;&00-&0F
  172. MOV R2,R0
  173. CMP R2,#15
  174. ADDNE R2,R2,#2
  175. MOVEQ R2,#256
  176. getbyte
  177. .loop2
  178. putbyte
  179. SUBS R2,R2,#1
  180. BGT loop2
  181. B typeins
  182.  
  183. .type2     ;&10-&1F
  184. MOV R2,R0
  185. AND R2,R2,#&F
  186. ADD R2,R2,#1
  187. .loop3
  188. getbyte
  189. putbyte
  190. SUBS R2,R2,#1
  191. BGT loop3
  192. B typeins
  193.  
  194. .type3     ;&20-&3F
  195. MOV R1,R0
  196. getbyte
  197. AND R2,R1,#&1C
  198. MOV R2,R2,LSR #2
  199. ADD R2,R2,#2
  200. AND R3,R1,#&3
  201. ADD R3,R0,R3,LSL #8
  202. SUB R3,R10,R3
  203. .loop5
  204. MOV R0,R3
  205. translate
  206. LDRB R0,[R0]
  207. putbyte
  208. SUB R3,R3,#1
  209. SUBS R2,R2,#1
  210. BGT loop5
  211. B typeins
  212.  
  213. .type4      ;&40-&7F
  214. MOV R1,R0
  215. getbyte
  216. AND R2,R1,#&38
  217. MOV R2,R2,LSR #3
  218. ADD R2,R2,#2
  219. AND R4,R1,#&06
  220. MOV R4,R4,LSR #1
  221. CMP R4,#2
  222. ADDGE R4,R4,#1
  223.  
  224. AND R3,R1,#&1
  225. ADD R3,R0,R3,LSL #8
  226. SUB R5,R10,R3
  227.  
  228. MOV R1,#1
  229. MOV R4,R1,LSL R4
  230.  
  231. MOV R3,#0
  232. .loop6
  233. ADD R0,R5,R3,ASR #2
  234. translate
  235. LDRB R0,[R0]
  236. putbyte
  237. ADD R3,R3,R4
  238. SUBS R2,R2,#1
  239. BGT loop6
  240. B typeins
  241.  
  242. .openfile
  243. STMFD R13!,{R0-R2,R14}
  244. MOV R2,R1
  245. MOV R1,R0
  246. MOV R0,#&4C
  247. CMP R2,#0
  248. ORRNE R0,R0,#2
  249. SWI XOS_Find
  250. MOVVS R6,#0
  251. LDMVSFD R13!,{R1-R3,PC}
  252.  
  253. MOV R6,R0
  254. LDMFD R13!,{R0-R2,PC}
  255.  
  256. .closefile
  257. STMFD R13!,{R0-R1,R14}
  258. MOV R0,#0
  259. MOV R1,R6
  260. CMP R6,#0
  261. SWINE XOS_Find
  262. MOV R6,#0
  263. LDMFD R13!,{R0-R1,PC}^
  264.  
  265. .nothmr
  266. ADR R0,nothmrtext
  267. MOV R1,#0
  268. .err
  269. ADR R3,traperr
  270. ORR R14,R14,#1<<28
  271. MOVS PC,R14
  272.  
  273. .nothmr2
  274. ADR R0,nothmr2text
  275. SWI OS_GenerateError
  276.  
  277. .traperr
  278. ADR R0,traperrtext
  279. SWI OS_GenerateError
  280.  
  281. .overrunerr
  282. ADR R0,overrunerrtext
  283. ADD R0,R0,#4
  284. SWI OS_Write0
  285. SWI OS_NewLine
  286. B decompend
  287.  
  288. .underrunerr
  289. ADR R0,underrunerrtext
  290. ADD R0,R0,#4
  291. SWI OS_Write0
  292. SWI OS_NewLine
  293. B decompend
  294.  
  295. .fileerr
  296. STMFD R13!,{R0,R14}
  297. BL closefile
  298. LDMFD R13!,{R0,R14}
  299. ADR R0,fileerrtext
  300. B err
  301.  
  302. .inconserr
  303. STMFD R13!,{R14}
  304. ADR R0,inconserrtext
  305. ADD R0,R0,#4
  306. SWI OS_Write0
  307. SWI OS_NewLine
  308. LDMFD R13!,{PC}
  309.  
  310. .nothmrtext
  311. DCD &666
  312. DCB "Decomp : Not a hammer file",0
  313. ALIGN
  314. .nothmr2text
  315. DCD &666
  316. DCB "Decomp : R0 corrupted during space allocation",0
  317. ALIGN
  318. .traperrtext
  319. DCD &666
  320. DCB "Decomp : Your error trapping is not working",0
  321. ALIGN
  322. .overrunerrtext
  323. DCD &666
  324. DCB "Decomp : Overrun - bad hammer file",0
  325. ALIGN
  326. .underrunerrtext
  327. DCD &666
  328. DCB "Decomp : Underrun - bad hammer file",0
  329. ALIGN
  330. .inconserrtext
  331. DCD &666
  332. DCB "Decomp : File length inconsistent with header",0
  333. ALIGN
  334. .fileerrtext
  335. DCD &666
  336. DCB "Decomp : File error",0
  337. ALIGN
  338. .idcode
  339. DCB "Hm",0,0
  340. .spec
  341. DCB "Decomp 0.01",0
  342. ALIGN
  343. .testfile
  344. DCB "$.testfile",0
  345. ALIGN
  346.